package com.lam.common.base.page;

import java.util.List;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.lam.common.utils.NumberUtil;
import com.lam.common.utils.ServletUtils;
import com.lam.common.utils.StringUtils;
import com.lam.common.utils.TableInfoUtil;
import com.lam.common.utils.sql.SqlUtil;

/**
 * 表格数据处理
 * 
 * @author lam
 */
public class TableHelper {
	
	/** 当前记录起始索引 */
	public static final String PAGE_NUM = "pageNum";

	/** 每页显示记录数 */
	public static final String PAGE_SIZE = "pageSize";

	/** 排序列 */
	public static final String ORDER_BY = "orderBy";

	/** 排序的方向 "desc" 或者 "asc". */
	public static final String ORDER_DIREC = "orderDirec";
	
	/** 排序的方向 asc 正序排序 */
	public static final String ORDER_ASC = "asc";
	/** 排序的方向 desc 倒序排序 */
	public static final String ORDER_DESC = "desc";

	/** 封装分页对象 */
	public static PageVo getPageVo() {
		PageVo pageVo = new PageVo();
		String pageNum = ServletUtils.getParameter("current");
		String pageSize = ServletUtils.getParameter("size");
		if(StringUtils.isBlank(pageNum)) {
			pageNum = ServletUtils.getParameter(PAGE_NUM);
		}
		if(StringUtils.isBlank(pageSize)) {
			pageSize = ServletUtils.getParameter(PAGE_SIZE);
		}
		pageVo.setPageNum(NumberUtil.toInt(pageNum, 1));
		pageVo.setPageSize(NumberUtil.toInt(pageSize, 10));
		pageVo.setOrderBy(ServletUtils.getParameter(ORDER_BY));
		pageVo.setOrderDirec(ServletUtils.getParameter(ORDER_DIREC));
		return pageVo;
	}
	
	public static void startPage() {
		startPage(null);
	}

	/**
	 * 设置分页信号，接下来的第一个SQL查询会进行排序
	 * @param entityClass
	 */
	public static void startPage(Class<?> entityClass) {
		PageVo pageVo = getPageVo();
		String orderBySql = getOrderBySql(entityClass, pageVo.getOrderBy(), pageVo.getOrderDirec());
		PageHelper.startPage(pageVo.getPageNum(), pageVo.getPageSize(), orderBySql);
	}
	
	/**
	 * 设置排序信号，接下来的第一个SQL查询会进行排序
	 * @param entityClass
	 */
	public static void withOrderBy(Class<?> entityClass) {
		PageVo pageVo = getPageVo();
		PageHelper.orderBy(getOrderBySql(entityClass, pageVo.getOrderBy(), pageVo.getOrderDirec()));
	}
	
	/**
	 * 设置排序信号，接下来的第一个SQL查询会进行排序(正序排序)
	 * @param orderByProp java属性名称
	 */
	public static void orderBy(String orderByProp) {
		orderBy(null, orderByProp, null);
	}
	
	/**
	 * 设置排序信号，接下来的第一个SQL查询会进行排序
	 * @param orderByProp java属性名称
	 * @param orderDirec 排序方向，为null则正序
	 */
	public static void orderBy(String orderByProp, String orderDirec) {
		orderBy(null, orderByProp, orderDirec);
	}
	
	/**
	 * 设置排序信号，接下来的第一个SQL查询会进行排序
	 * @param entityClass
	 * @param orderByProp java属性名称
	 * @param orderDirec 排序方向，为null则正序
	 */
	public static void orderBy(Class<?> entityClass, String orderByProp, String orderDirec) {
		PageHelper.orderBy(getOrderBySql(entityClass, orderByProp, orderDirec));
	}
	
	/**
	 * 设置排序信号，接下来的第一个SQL查询会进行排序(正序排序)
	 * @param orderByColumn 数据库字段名称
	 */
	public static void orderByColumn(String orderByColumn) {
		orderByColumn(orderByColumn, null);
	}
	
	/**
	 * 设置排序信号，接下来的第一个SQL查询会进行排序
	 * @param orderByColumn 数据库字段名称
	 * @param orderDirec 排序方向，为null则正序
	 */
	public static void orderByColumn(String orderByColumn, String orderDirec) {
		PageHelper.orderBy(getOrderBySql(orderByColumn, orderDirec));
	}
	
	/**
	 * 根据Java属性字段，获取排序的SQL
	 * @param entityClass
	 * @param orderByProp
	 * @param orderDirec
	 * @return
	 */
	public static String getOrderBySql(Class<?> entityClass, String orderByProp, String orderDirec) {
		
		if (StringUtils.isEmpty(orderByProp)) {
			return "";
		}
		
		String orderColumn = TableInfoUtil.getColumn(entityClass, orderByProp);
		return getOrderBySql(orderColumn, orderDirec);
	}
	
	/**
	 * 根据数据库字段，获取排序的SQL
	 * @param orderColumn 数据库字段
	 * @param orderDirec 排序方向
	 * @return
	 */
	public static String getOrderBySql(String orderColumn, String orderDirec) {
		
		if (StringUtils.isEmpty(orderColumn)) {
			return "";
		}
		
		return SqlUtil.escapeOrderBySql(String.format("%s %s", orderColumn, getOrderDirec(orderDirec)));
	}
	
	/**
	 * 获取排序方向 
	 * @param orderDirec
	 * @return
	 */
	public static String getOrderDirec(String orderDirec) {
		return StringUtils.containsIgnoreCase(orderDirec, "desc")?"desc":"asc";
	}
	
	/**
	 * 封装分页数据
	 */
	public static TableData createTableData(List<?> list) {
		
		TableData tableData = new TableData();
		tableData.records(list);
		PageInfo<?> pageInfo = new PageInfo<>(list);
		tableData.total(pageInfo.getTotal());
		tableData.setPageNum(pageInfo.getPageNum());
		tableData.setPageSize(pageInfo.getPageSize());
		return tableData;
	}
	
}
